﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QuanLyHocPhi.Model;

namespace QuanLyHocPhi.BLL
{
    partial class BizPhiMacDinh
    {
        public static List<MucThu> GetListMucThu(string maHocKy)
        {
            using (var context = new QLHPEntities())
            {
                var lst = context.PhiMacDinhDbSet.Where(e => e.MaHocKy == maHocKy).
                    Select(e => new MucThu()
                    {
                        MaHocKy = e.MaHocKy,
                        MaLopGoc = e.MaLopGoc,
                        TenLopGoc = e.LopGoc.TenLopGoc,
                        NamTuyenSinh = e.LopGoc.NamTuyenSinh,
                        MaLoaiHinhDaoTao = e.LopGoc.MaLoaiHinhDaoTao,
                        TenLoaiHinhDaoTao = e.LopGoc.LoaiHinhDaoTao.TenLoaiHinh,
                        HocPhi = e.HocPhi,
                        LePhi = e.LePhi
                    }).ToList();
                return lst;
            }
        }

        public static List<string> GetListMaLopGocDaQuyDinhMucThu(string maHocKy)
        {
            using (var context = new QLHPEntities())
            {
                var lst = context.PhiMacDinhDbSet.Where(e => e.MaHocKy == maHocKy).Select(e => e.MaLopGoc).ToList();
                return lst;
            }
        }

        public static void DeleteMucThu(MucThu mucThu)
        {
            using (var context = new QLHPEntities())
            {
                var oMucThu = context.PhiMacDinhDbSet.Where(e => e.MaHocKy == mucThu.MaHocKy && e.MaLopGoc == mucThu.MaLopGoc).FirstOrDefault();
                if (oMucThu == null)
                    throw new Exception(
                        "Quy định mức thu không còn tồn tại trên hệ thống\n" +
                        "Hãy nạp lại dữ liệu");
                context.PhiMacDinhDbSet.Remove(oMucThu);
                context.SaveChanges();
            }
        }

        public static void SaoChepMucThu(string fromMaHocKy, string toMaHocKy, bool overwrite = false)
        {
            using (var context = new QLHPEntities())
            {
                // Đọc danh sách các mức thu tại học kỳ fromMaHocKy
                var lstSource = context.PhiMacDinhDbSet.Where(e => e.MaHocKy == fromMaHocKy).ToList();

                // Tạo các mức thu tương ứng cho học kỳ toMaHocKy
                var lstDest = lstSource.Select(e => new PhiMacDinh()
                {
                    MaHocKy = toMaHocKy,
                    MaLopGoc = e.MaLopGoc,
                    HocPhi = e.HocPhi,
                    LePhi = e.LePhi
                }).ToList();

                // Ghi vào csdl
                foreach (var mucThu in lstDest)
                {
                    var oMucThu = context.PhiMacDinhDbSet.Where(e => e.MaHocKy == mucThu.MaHocKy && e.MaLopGoc == mucThu.MaLopGoc).FirstOrDefault();
                    if (overwrite)
                    {
                        #region Ghi đè nếu đã định nghĩa mức thu trước đó
                        if (oMucThu == null)
                            context.PhiMacDinhDbSet.Add(mucThu);
                        else
                        {
                            oMucThu.HocPhi = mucThu.HocPhi;
                            oMucThu.LePhi = mucThu.LePhi;
                        }
                        #endregion
                    }
                    else
                    {
                        #region Nếu đã tồn tại thì bỏ qua
                        if (oMucThu == null)
                            context.PhiMacDinhDbSet.Add(mucThu);
                        #endregion
                    }

                }
                context.SaveChanges();
            }
        }

        public static void UpdatePhiMacDinh(MucThu mucThu, int hocPhi, int lePhi)
        {
            using (var context = new QLHPEntities())
            {
                var oPhiMacDinh = context.PhiMacDinhDbSet.Where(e => e.MaHocKy == mucThu.MaHocKy && e.MaLopGoc == mucThu.MaLopGoc).FirstOrDefault();
                if (oPhiMacDinh == null)
                    throw new Exception("Mức thu không còn tồn tại trên hệ thống");
                oPhiMacDinh.HocPhi = hocPhi;
                oPhiMacDinh.LePhi = lePhi;
                context.SaveChanges();
            }
        }

        /// <summary>
        /// Thiết lập mức thu học phí, lệ phí mặc định cho các lớp gốc ở học kỳ cụ thể
        /// </summary>
        /// <param name="hocKy"></param>
        /// <param name="lstMaLopGoc"></param>
        /// <param name="hocPhi"></param>
        /// <param name="lePhi"></param>
        public static void SetPhiMacDinh(HocKy hocKy, List<string> lstMaLopGoc, int hocPhi, int lePhi)
        {
            using (var context = new QLHPEntities())
            {
                var maHocKy = hocKy.MaHocKy;
                foreach (var maLopGoc in lstMaLopGoc)
                {
                    var oPhiMacDinh = new PhiMacDinh()
                    {
                        MaHocKy = maHocKy,
                        MaLopGoc = maLopGoc,
                        HocPhi = hocPhi,
                        LePhi = lePhi
                    };
                    var count = context.PhiMacDinhDbSet.Where(e => e.MaHocKy == maHocKy && e.MaLopGoc == maLopGoc).Count();
                    if (count > 0)
                        throw new Exception("Xung đột thông tin mức thu học phí.\n" +
                            "Hãy nạp lại dữ liệu trước khi thực hiện thiết lập mức lệ phí.");
                    context.PhiMacDinhDbSet.Add(oPhiMacDinh);
                }
                context.SaveChanges();
            }
        }
    }

    [System.ComponentModel.DataAnnotations.Schema.NotMapped]
    public class MucThu
    {
        public string MaLopGoc { get; set; }
        public string TenLopGoc { get; set; }
        public string NamTuyenSinh { get; set; }
        public string MaLoaiHinhDaoTao { get; set; }
        public string TenLoaiHinhDaoTao { get; set; }
        public string MaHocKy { get; set; }
        public int HocPhi { get; set; }
        public int LePhi { get; set; }
    }
}